﻿/**************************************************************
 *
 * 唯一标识：049bedeb-c2c1-4f1a-b088-24f656fb76a8
 * 命名空间：Sgr.EntityFrameworkCore
 * 创建时间：2023/8/5 18:10:24
 * 机器名称：DESKTOP-S0D075D
 * 创建者：antho
 * 电子邮箱：fengqinhua2016@163.com
 * 描述：
 *
 **************************************************************/

//using Microsoft.EntityFrameworkCore;
//using Sgr.Licence;
//using System;
//using System.Collections.Concurrent;
//using System.Collections.Generic;
//using System.Collections.ObjectModel;
//using System.Linq;
//using System.Runtime.InteropServices;
//using System.Text;
//using System.Threading.Tasks;

//namespace Sgr.EntityFrameworkCore
//{
//    /// <summary>
//    /// 注册器
//    /// </summary>
//    public class EntityFrameworkTypeRegistrar
//    {
//        // 存储DbContext类型和对应的实体类型提供器集合
//        private readonly ConcurrentDictionary<Type, HashSet<Type>> _typeProviders;

//        #region 单例模式

//        /// <summary>
//        /// 实例
//        /// </summary>
//        public static EntityFrameworkTypeRegistrar Instance
//        { get { return Nested.instance; } }

//        private EntityFrameworkTypeRegistrar()
//        {
//            _typeProviders = new ConcurrentDictionary<Type, HashSet<Type>>();
//        }

//        /// <summary>
//        /// 通过嵌套类实现单利模式
//        /// </summary>
//        private class Nested
//        {
//            static Nested()
//            {
//            }

//            internal static readonly EntityFrameworkTypeRegistrar instance = new();
//        }

//        #endregion 单例模式

//        /// <summary>
//        /// 注册实体类型提供器
//        /// </summary>
//        /// <param name="dbContextType">DbContext类型</param>
//        /// <param name="providerType">实体类型提供器类型</param>
//        public void Register(Type dbContextType, Type providerType)
//        {
//            // 参数验证
//            Check.NotNull(dbContextType, nameof(dbContextType));
//            Check.NotNull(providerType, nameof(providerType));

//            // 验证dbContextType是否继承自DbContext
//            if (!typeof(DbContext).IsAssignableFrom(dbContextType))
//                throw new ArgumentException($"类型 {dbContextType.FullName} 必须继承自 DbContext");

//            // 验证providerType是否实现IEntityFrameworkTypeProvider接口
//            if (!typeof(IEntityFrameworkTypeProvider).IsAssignableFrom(providerType))
//                throw new ArgumentException($"类型 {providerType.FullName} 必须实现 IEntityFrameworkTypeProvider 接口");

//            // 获取或创建提供器集合
//            var providers = _typeProviders.GetOrAdd(dbContextType, _ => new HashSet<Type>());

//            // 线程安全地添加提供器类型
//            lock (providers)
//            {
//                providers.Add(providerType);
//            }
//        }

//        /// <summary>
//        /// 注册实体类型提供器
//        /// </summary>
//        /// <typeparam name="TDbContext"></typeparam>
//        /// <typeparam name="TProvider"></typeparam>
//        public void Register<TDbContext, TProvider>()
//            where TDbContext : UnitOfWorkDbContext
//            where TProvider : IEntityFrameworkTypeProvider, new()
//        {
//            Type tDbContext = typeof(TDbContext);
//            Type tProvider = typeof(TProvider);

//            Register(tDbContext, tProvider);
//        }

//        /// <summary>
//        /// 所有已注册的类型
//        /// </summary>
//        public IEnumerable<Type> GetTypeProviders<TDbContext>()
//             where TDbContext : UnitOfWorkDbContext
//        {
//            Type tDbContext = typeof(TDbContext);

//            return GetTypeProviders(tDbContext);
//        }

//        /// <summary>
//        /// 获取指定DbContext类型的所有实体类型提供器
//        /// </summary>
//        /// <param name="dbContextType">DbContext类型</param>
//        /// <returns>实体类型提供器集合</returns>
//        public IEnumerable<Type> GetTypeProviders(Type dbContextType)
//        {
//            Check.NotNull(dbContextType, nameof(dbContextType));

//            // 如果找到类型提供器集合则返回，否则返回空集合
//            return _typeProviders.TryGetValue(dbContextType, out var providers)
//                ? providers
//                : Array.Empty<Type>();
//        }

//        /// <summary>
//        /// 获取指定DbContext类型的所有实体类型提供器实例
//        /// </summary>
//        /// <param name="dbContextType">DbContext类型</param>
//        /// <returns>实体类型提供器实例集合</returns>
//        public IEnumerable<IEntityFrameworkTypeProvider> GetTypeProviderInstances(Type dbContextType)
//        {
//            foreach (var providerType in GetTypeProviders(dbContextType))
//            {
//                if (Activator.CreateInstance(providerType) is IEntityFrameworkTypeProvider provider)
//                {
//                    yield return provider;
//                }
//            }
//        }

//        /// <summary>
//        /// 清除指定DbContext类型的所有注册
//        /// </summary>
//        /// <param name="dbContextType">DbContext类型</param>
//        public void Clear(Type dbContextType)
//        {
//            Check.NotNull(dbContextType, nameof(dbContextType));

//            _typeProviders.TryRemove(dbContextType, out _);
//        }

//        /// <summary>
//        /// 清除所有注册
//        /// </summary>
//        public void ClearAll()
//        {
//            _typeProviders.Clear();
//        }
//    }
//}